package whf.framework.service;

import java.io.Serializable;

import whf.framework.entity.Entity;
import whf.framework.exception.CreateException;
import whf.framework.exception.DuplicateException;
import whf.framework.exception.NotFoundException;
import whf.framework.exception.RemoveException;
import whf.framework.exception.ServiceException;
import whf.framework.exception.UpdateException;
import whf.framework.meta.Meta;

/**
 * 基本服务操作<br>
 * 提供基于BaseBO的业务对象的CRUD操作和相关Finder方法
 * @author wanghaifeng
 * @version 1.0
 */
public interface Service<T extends Entity> extends QueryService<T>, FindService<T>{
	
	public Meta getMeta();
	/**
	 * 删除指定的多主键的业务对象
	 * @param keys 主键数组
	 * @throws RemoveException，删除失败异常
	 */
	public void removeByPrimaryKey(Serializable keys[]) throws RemoveException, NotFoundException;
	
	/**
	 * @param keys
	 * @throws RemoveException
	 */
	public void removeByPrimaryKey(long[] keys) throws RemoveException, NotFoundException;
	
	/**
	 * 删除指定主键的业务对象
	 * @param key 主键
	 * @throws RemoveException 删除失败异常
	 */
	public void removeByPrimaryKey(Serializable key) throws RemoveException, NotFoundException;

	/**
	 * @param key
	 * @throws RemoveException
	 */
	public void removeByPrimaryKey(long key) throws RemoveException;
	/**
	 * 删除业务对象
	 * @param entity 业务对象
	 * @throws RemoveException 删除失败异常
	 */
	public void remove(T entity) throws RemoveException;

	/**
	 * 创建业务对象
	 * @param bo业务对象
	 * @throws CreateException 创建失败异常
	 */
	public void create(T entity) throws CreateException;

	/**
	 * 复制对象,对于Collection中的对象根据deepth中的设置复制
	 * @modify wanghaifeng Aug 26, 2006 10:12:19 AM
	 * @param entity
	 * @param deepth 
	 * @throws DuplicateException 任何异常封装为复制异常
	 */
	public T duplicate(T entity, int deepth) throws DuplicateException, CreateException;
	
	/**
	 * 同上
	 * @modify wanghaifeng Aug 26, 2006 11:18:48 AM
	 * @param entity
	 * @return
	 * @throws DuplicateException
	 */
	public T duplicate(T entity) throws DuplicateException, CreateException;
	/**
	 * 修改业务对象
	 * @param entity 业务对象
	 * @throws UpdateException 修改失败异常
	 */
	public void update(T entity) throws UpdateException;

	/**
	 * 搜索指定主键的业务对象
	 * @param key 主键
	 * @return 业务对象
	 * @throws NotFoundException 找不到指定主键对象异常
	 */
	public T findByPrimaryKey(Serializable key) throws NotFoundException;
    
    /**
     * 调用当前服务中的一个方法
     * @param methodName 方法名称
     * @param types 参数类型
     * @param params 参数
     * @return
     * @throws ServiceException 抛出任何异常
     * @throws NoSuchMethodException No method found
     */
    public Object invokeMethod(String methodName,Class[] types, Object[] params) throws ServiceException, NoSuchMethodException;

}
